
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package objetos;

/**
 *
 * @author Miguel && Yaniré
 */
import objetos.personajes.*;
import interfaz.*;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Random;

public class Aldea {

    public static int cantidadxPersonaje;
    public static int cantidadxArma;
    private ArrayList<Personaje> personajes = new ArrayList<Personaje>();
    private ArrayList<Arma> armas = new ArrayList<Arma>();
    private int x;
    private int y;

// <editor-fold defaultstate="collapsed" desc="Constructor">
    public Aldea() {
	setPersonajes();
	setArmas();
    }

    public final void setPersonajes() {
	for (int i = 0; i < cantidadxPersonaje; i++) {
	    personajes.add(new Rabona());
	}

	for (int i = 0; i < cantidadxPersonaje; i++) {
	    personajes.add(new Indigena());
	}

	for (int i = 0; i < cantidadxPersonaje; i++) {
	    personajes.add(new SoldadoDeInfanteria());
	}

	for (int i = 0; i < cantidadxPersonaje; i++) {
	    personajes.add(new SoldadoDeCaballeria());
	}

	for (int i = 0; i < cantidadxPersonaje; i++) {
	    personajes.add(new Artillero());
	}
    }

    public final void setArmas() {
	/*
	Constructor de armas:
	new Arma(Tipo de personaje, Tipo de arma, Nombre de arma)

	Tipo de personaje:
	1. Artillero	: cañon, escudo
	2. Caballeria	: lanza, caballeria, escudo
	3. Infanteria	: fusil, bayoneta, escudo
	4. Indigena		: piedras, rejones, hondas, escudo

	Tipo de arma:
	0. Defensa
	1. Ataque
	 */

	for (int i = 0; i < cantidadxArma; i++) {
	    armas.add(new Arma(4, 0, "escudo"));
	    armas.add(new Arma(4, 1, "piedras"));
	    armas.add(new Arma(4, 1, "rejones"));
	    armas.add(new Arma(4, 1, "hondas"));
	}

	for (int i = 0; i < cantidadxArma; i++) {
	    armas.add(new Arma(3, 0, "escudo"));
	    armas.add(new Arma(3, 1, "fusil"));
	    armas.add(new Arma(3, 1, "bayoneta"));
	}

	for (int i = 0; i < cantidadxArma; i++) {
	    armas.add(new Arma(2, 0, "escudo"));
	    armas.add(new Arma(2, 1, "lanza"));
	    armas.add(new Arma(2, 1, "caballeria"));
	}

	for (int i = 0; i < cantidadxArma; i++) {
	    armas.add(new Arma(1, 0, "escudo"));
	    armas.add(new Arma(1, 1, "cañon"));
	}

	for (int i = 0; i < cantidadxArma; i++) {
	    armas.add(new Arma(0, 0, "escudo"));
	    armas.add(new Arma(0, 1, "lanzon"));
	}
    }
    // </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Getters & Setters">
    public int generarRandom(int n) {
        Random generator = new Random();
        return generator.nextInt(n);
    }
    public String[] getListaEnteros(int limite) {
	String[] listaEnteros = new String[limite];
	for (int i = 1; i <= limite; i++) {
	    listaEnteros[i - 1] = Integer.toString(i);
	}
	return listaEnteros;
    }

    public ArrayList<Personaje> getPersonajes() {
	return personajes;
    }

    public ArrayList<Arma> getArmas() {
	return armas;
    }

    public int getStockxTipoPersonaje(int tipoPersonaje) {
	int cantidad = 0;
	for (Personaje personaje : personajes) {
	    if (personaje.getTipoPersonaje() == tipoPersonaje) {
		cantidad++;
	    }
	}

	return cantidad;
    }

    public int getStockxTipoArma(String nombreArma) {
	int cantidad = 0;
	for (Arma arma : armas) {
	    if (arma.getNombreArma().toUpperCase().equals(nombreArma.toUpperCase())) {
		cantidad++;
	    }
	}

	return cantidad;
    }

    public int getX() {
	return x;
    }

    public void setX(int x) {
	this.x = x;
    }

    public int getY() {
	return y;
    }

    public void setY(int y) {
	this.y = y;
    }

    public Personaje getPersonaje(int tipoPers) {
	Personaje personaje = null;
	for (int i = 0; i < personajes.size(); i++) {
	    if (personajes.get(i).getTipoPersonaje() == tipoPers) {
		personaje = personajes.get(i);
                personajes.remove(i);
		break;
	    }
	}
	return personaje;
    }

    public Arma getArma(int tipoPers, String nombreArma) {
	Arma arma = null;
	for (int i = 0; i < armas.size(); i++) {
	    if (armas.get(i).getNombreArma().toUpperCase().equals(nombreArma.toUpperCase())
		    && armas.get(i).getTipoArmaxPersonaje() == tipoPers) {
		arma = armas.get(i);
                armas.remove(i);
		break;
	    }
	}
	return arma;
    }
// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Pop-Ups">
    public void mostrarMensajeError(LaVentana ventana, String mensaje) {
	JOptionPane.showMessageDialog(ventana, mensaje, "Compra Anulada", JOptionPane.ERROR_MESSAGE);
    }

    public int mostrarListaBotones(LaVentana ventana, String mensaje, String[] opciones) {
	return JOptionPane.showOptionDialog(ventana, mensaje, "Compras", 1, 1, null, opciones, opciones[0]);
    }

    public Object mostrarListaCombo(LaVentana ventana, String mensaje, String[] opciones) {
	return JOptionPane.showInputDialog(ventana, mensaje, "Compras", 1, null, opciones, opciones[0]);
    }
// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Compra Arma">
    public String getNombreArma(LaVentana ventana, int tipoPersonaje) {
	/*
	Constructor de armas:
	new Arma(Tipo de personaje, Tipo de arma, Nombre de arma)

	Tipo de personaje:
	0. Principal	: lanzon, escudo
	1. Artillero	: cañon, escudo
	2. Caballeria	: lanza, caballeria, escudo
	3. Infanteria	: fusil, bayoneta, escudo
	4. Indigena	: piedras, rejones, hondas, escudo

	Tipo de arma:
	0. Defensa
	1. Ataque
	 */

	String[] opciones = null;
	//Muestra tipos de arma

	switch (tipoPersonaje) {
	    case 0:
		opciones = new String[2];
		opciones[0] = "Lanzon";
		opciones[1] = "Escudo";
		break;
	    case 1:
		opciones = new String[2];
		opciones[0] = "Cañon";
		opciones[1] = "Escudo";
		break;
	    case 2:
		opciones = new String[3];
		opciones[0] = "Lanza";
		opciones[1] = "Caballeria";
		opciones[2] = "Escudo";
		break;
	    case 3:
		opciones = new String[3];
		opciones[0] = "Fusil";
		opciones[1] = "Bayoneta";
		opciones[2] = "Escudo";
		break;
	    case 4:
		opciones = new String[4];
		opciones[0] = "Piedras";
		opciones[1] = "Rejones";
		opciones[2] = "Hondas";
		opciones[3] = "Escudo";
		break;

	}

	int aComprar = mostrarListaBotones(ventana, "¿Cuál arma?", opciones);

	if (aComprar == -1) {
	    return null;
	}
	return opciones[aComprar];

    }

    public boolean comprarArma(LaVentana ventana, Personaje personaje, Bando bando) {

	int tipoPersonaje = personaje.getTipoPersonaje();
	String nombreArma = getNombreArma(ventana, tipoPersonaje);
	if (nombreArma == null) {
	    return false;
	}

	int tipoArma = nombreArma.toLowerCase().equals("escudo") ? 0 : 1;

	int stock = getStockxTipoArma(nombreArma);
	int capacidad = personaje.getArmasPosibles(tipoArma);

	boolean personajeSoporta = capacidad > 0 && stock > 0;
	boolean bandoSoporta = bando.esPosibleComprarArma(new Arma(tipoPersonaje, tipoArma, nombreArma));

	if (personajeSoporta && bandoSoporta) {
	    Arma arma = getArma(tipoPersonaje, nombreArma);
	    bando.restarDinero(arma.getCosto());
	    switch (tipoArma) {
		case 0:
		    personaje.setArmaDefensa(arma);
		    break;
		case 1:
		    personaje.setArmaAtaque(arma);
		    break;
	    }
	    return true;
	}
	mostrarMensajeError(ventana, "No hay stock o te falta dinero");
	return false;
    }
// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Comprar Personaje">
    public Personaje inicializarPersonaje(int tipoPersonaje) {
	Personaje soldado = null;

	switch (tipoPersonaje) {
	    case 1:
		soldado = new Artillero();
		break;
	    case 2:
		soldado = new SoldadoDeCaballeria();
		break;
	    case 3:
		soldado = new SoldadoDeInfanteria();
		break;
	    case 4:
		soldado = new Indigena();
		break;
	    case 5:
		soldado = new Rabona();
		break;
	}

	return soldado;
    }

    public Personaje comprarPersonaje(LaVentana ventana, Bando bando) {

	String[] opciones = {"Artillero", "Caballeria", "Infante", "Indigena", "Rabona"};
	int tipoPersonaje = 1 + mostrarListaBotones(ventana, "Elija el tipo de personaje", opciones);
	if (tipoPersonaje == 0) {
	    return null;
	}

	int stock = getStockxTipoPersonaje(tipoPersonaje);
	boolean bandoSoporta = bando.esPosibleComprarPersonaje(inicializarPersonaje(tipoPersonaje));

	if (stock > 0 && bandoSoporta) {
	    Personaje personaje = getPersonaje(tipoPersonaje);
	    bando.restarDinero(personaje.getCosto());
	    personaje.setBando(bando.getTipo());
	    return personaje;
	}

	mostrarMensajeError(ventana, "No hay stock o te falta dinero");
	return null;
    }
    // </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Compra Arma Artificial">
    public String adquirirNombreArmaArtificial(int[] tipoArmaPers) {

	/*
	 * artilleria:  cañon, escudo
	 * caballeria:  lanza, caballeria, escudo
	 * infanteria:  fusil, bayoneta, escudo
	 * indigenas:   piedras, rejones, hondas
	 * 1:artilleria 2:caballeria 3:infanteria 4:indigena
	 */

	String nombreArma = null;
	int tipoArma;

	//Muestra tipos de arma
	if ((tipoArmaPers[0] == 1) && (tipoArmaPers[1] != 1)) {

	    switch (tipoArmaPers[1]) {
		case 2:
		    tipoArma = generarRandom(2);
		    switch (tipoArma) {
			case 0:
			    nombreArma = "Lanza";
			    break;
			case 1:
			    nombreArma = "Caballeria";
			    break;
		    }
		    break;
		case 3:
		    tipoArma = generarRandom(2);
		    switch (tipoArma) {
			case 0:
			    nombreArma = "Fusil";
			    break;
			case 1:
			    nombreArma = "Bayoneta";
			    break;
		    }
		    break;
		case 4:
		    tipoArma = generarRandom(3);
		    switch (tipoArma) {
			case 0:
			    nombreArma = "Piedras";
			    break;
			case 1:
			    nombreArma = "Rejones";
			    break;
			case 2:
			    nombreArma = "Hondas";
			    break;
		    }
		    break;

	    }
	} else {
	    if ((tipoArmaPers[0] == 1) & (tipoArmaPers[1] == 1)) {
		nombreArma = "cañon";
	    }

	    if (tipoArmaPers[0] == 0) {
		nombreArma = "escudo";
	    }
	}

	return nombreArma;
    }

    public int[] adquirirArmaArtificial(Personaje personaje) {

	int tipoArmaPers[] = new int[3]; // {tipo de arma, tipo de personaje, cantidad}
	//almacena tipoArma(ataque o defensa)
	//y el tipo de personaje que adquiere el arma

	tipoArmaPers[1] = personaje.getTipoPersonaje();

	//0:principal 1:artilleria 2:caballeria 3:infanteria 4:indigena

	//Genera tipo de arma
	//Defensa 0, ataque 1

	tipoArmaPers[0] = generarRandom(2);

	//cantidad de armas a comprar

	tipoArmaPers[2] = 1;

	return tipoArmaPers;
    }

    public boolean comprarArmaArt(Bando bando, Personaje personaje) {
        int tipoArmaPers[] = adquirirArmaArtificial(personaje);
	String nombreArma = adquirirNombreArmaArtificial(tipoArmaPers);
	if (nombreArma == null) {
	    return false;
	}

	int stock = getStockxTipoArma(nombreArma);
	int capacidad = personaje.getArmasPosibles(tipoArmaPers[0]);

	boolean personajeSoporta = capacidad > 0 && stock > 0;
	boolean bandoSoporta = bando.esPosibleComprarArma(new Arma(tipoArmaPers[1], tipoArmaPers[0], nombreArma));

	if (personajeSoporta && bandoSoporta) {
	    Arma arma = getArma(tipoArmaPers[0], nombreArma);
	    bando.restarDinero(arma.getCosto());
	    switch (tipoArmaPers[0]) {
		case 0:
		    personaje.setArmaDefensa(arma);
		    break;
		case 1:
		    personaje.setArmaAtaque(arma);
		    break;
	    }
	    return true;
	}
	return false;

    }
    // </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Compra Personaje artificial">
    /**
     *
     * Genera cantidad y tipo de personajes para la PC.
     */
    public int[] adquirirSoldadoArtificial() {

	int tipoCant[];

	tipoCant = new int[2];

	//genero tipo de personaje a comprar
	tipoCant[0] = generarRandom(5) + 1;

	//asigno de cantidad
	tipoCant[1] = 1;

	return tipoCant;
    }

     /**
     *
     * Ejecuta la compra de personajes de la PC.
     */
    public Personaje comprarPersonajeArtificial(Bando bando) {

	int [] tipoCant = adquirirSoldadoArtificial();

	int stock = getStockxTipoPersonaje(tipoCant[0]);
	boolean bandoSoporta = bando.esPosibleComprarPersonaje(inicializarPersonaje(tipoCant[0]));

	if (stock > 0 && bandoSoporta) {
	    Personaje personaje = getPersonaje(tipoCant[0]);
	    bando.restarDinero(personaje.getCosto());
	    personaje.setBando(bando.getTipo());
            
	    //bando.agregarPersonaje(personaje);
	    return personaje;
	}

	return null;
    }
    // </editor-fold>
}

